<template>
  <h2>当前求和为：{{ sum }}</h2>
  <button @click="sum++">点我加一</button>
  <hr>
  <h2>当前信息为：{{ msg }}</h2>
  <button @click="msg+='!'">修改信息</button>
  <h2>姓名：{{ person.name }}</h2>
  <h2>年龄：{{ person.age }}</h2>
  <button @click="person.age++">增加年龄</button>
  <button @click="person.name+='~`'">修改姓名</button>
  <h2>职业：{{ person.work.post }}</h2>
  <h2>薪水：{{ person.work.money }}K</h2>
  <button @click="person.work.money++">增加薪水</button>
  <button @click="person.work.post+='+'">修改职位</button>
</template>

<script>
import {reactive, ref, watch} from "vue";

export default {
  name: "Demo",
  setup() {
    let sum = ref(0)
    let msg = ref("你好啊")
    let person = reactive({
      name: '张三',
      age: 18,
      work: {
        money: 100,
        post: "后端开发"
      }

    })
    //watch 第一个是监视目标，第二个是函数，第三个是配置
    /*情况一：监视ref所定义的一个响应式数据
    watch(
    sum,
    function (newValue,oldValue){
      console.log("sum值变化了,以前是"+oldValue+",现在是"+newValue)
    }
    )

    */
    /*情况二：监视ref所定义的多个响应式数据
    watch(
    [sum,msg],
    function (newValue,oldValue){
      console.log("sum或msg的值变化了,以前是"+oldValue+",现在是"+newValue)
    },
    {immediate:true}
    )*/

    //情况三：1.注意：reactive定义的数据无法正确获得oldValue  2.强制开启了深度监视（deep配置无效）
    /* watch(
       person,
       function (newValue,oldValue){
         console.log(newValue,oldValue)
       }
     )*/

    //情况四：监视reactive定义的一个数据中的某个属性 必须要写成函数形式的返回值
    /*watch(
      function () {
        return person.age
      },
      function (newValue, oldValue) {
        console.log(newValue, oldValue)
      }
    )*/

    //情况五：监视reactive定义的一个数据中的某个些属性
    /* watch(
       [
         function (){
         return person.age
         },
         function (){
         return person.name
         }
       ],
       function (newValue, oldValue) {
         console.log(newValue, oldValue)
       }
     )*/

    //特殊情况：监视reactive定义的对象中的某个属性，deep配置有效
    watch(
      function () {
        return person.work
      },
      function (newValue, oldValue) {
        console.log(newValue, oldValue)
      },
      {deep:true}
    )

    return {
      sum,
      msg,
      person,
    }
  }
}
</script>

<style scoped>

</style>
